﻿using UnityEngine;
using System.Collections;

public class Waypoints : MonoBehaviour {
	
	public GameObject currentPoint;
	public float speed; //prędkość z jaką porusza się postać
	public int probabilityGoingBack = 5; 	//prawdopodobieństw z jakim po wylosowaniu drogi powrotnej ta droga zostanie wybrana,
											//a nie będzie ponownego losowania
	private Animator anim;
	private float distance = 0.01f; //dystans do waypointa, tj. jak blisko postać powinna się do niego zbliżyć
	private Vector3 targetPosition;
	private Vector3 previousPosition; 
	private bool change = false;
	
	
	// Use this for initialization
	void Start () {
		
		//pobranie componentu zarządzającego animacją
		anim = GetComponent<Animator> ();
		//ustawienie celu jako punkt startowy
		targetPosition = currentPoint.transform.position;
		//ustawienie poprzedniej pozycji jako punkt startowy
		previousPosition = currentPoint.transform.position;
		
		chooseSprite();
		//ustawienie prędkości wyświetlania animacji
		anim.speed = speed + 0.1f;
		foreach (Transform child in transform)
		{
			Animator childAnim = child.GetComponent<Animator>();
			childAnim.speed = speed + 0.1f;
		}
	}
	
	// Update is called once per frame
	void Update () {
		//jeśli postać zbliżyła się dostatecznie do waypointa to losujemy następny
		if (Vector3.Distance(transform.position, targetPosition) < distance && !change){
			nextPoint();
		} else {
			
			//krok z jakim ma się poruszać postać, zależy od prędkości podanej w parametrze
			var step = speed * Time.deltaTime;
			
			transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
			change = false;
			
			
		}
	}
	
	private void nextPoint()
	{
		//losowanie z waypointów w sąsiedzctwie
		NextWaypoints nextWaypointsScript = currentPoint.GetComponent<NextWaypoints>();
		if (nextWaypointsScript.getNextWaypoints ().Length > 0) {

			int random = Random.Range (0, nextWaypointsScript.getNextWaypoints ().Length);
			targetPosition = nextWaypointsScript.getNextWaypoints () [random].transform.position;
			//w przypadku wylosowania poprzedniego punkt, tj. powrotu do tej samej drogi 
			//losuj jeszcze raz jeśli random jest większy niż probabilityGoingBack %
			if (previousPosition == targetPosition && Random.Range(0,100) > probabilityGoingBack) {
				random = Random.Range (0, nextWaypointsScript.getNextWaypoints ().Length);
				targetPosition = nextWaypointsScript.getNextWaypoints () [random].transform.position;
			}
			
			//ustawienie poprzedniej pozycji
			previousPosition = currentPoint.transform.position;
			//ustawienie obecnego waypointa
			currentPoint = nextWaypointsScript.getNextWaypoints () [random];
			chooseSprite();
		}
		change = true;
	}
	
	private void chooseSprite() 
	{
		int dir = 0;
		//wybór wyświetlanego sprite'a (stanu w animatorze)
		if ((transform.position - targetPosition).x > 0)
			dir = 1;
		else
			dir = 3;
		anim.SetInteger ("direction", dir);
		
		//to samo dla dzieci danego obiektu
		foreach (Transform child in transform)
		{
			Animator childAnim = child.GetComponent<Animator>();
			childAnim.SetInteger ("direction", dir);
		}
	}
}
